/**
 * 文件名称:  TokenUtil.java
 * 文件序号:  序号
 * 内容描述:  文件简单描述，多行换行书写
 * 版权声明:  山东鸿蝶信息技术有限公司
 * 创建用户:   liuze
 * 创建日期:  2017/2/6 17:32
 * 修改用户:  无
 * 修改日期:  无
 * 修改说明:  无
 * 文件版本:  V1.0
 * 文件路径:
 */

package com.hongdee.common.util;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 名  称:TokenUtil
 * 类  型: class
 * 描  述: 通过 token取用户信息
 * 路  径:com.hongdee.common.util
 * 作  者: liuze
 * 日  期:2017/2/6 17:32
 */


@Component
public class TokenUtil {
    /**
     * 日志
     */
    private static Log logger = LogFactory.getLog(TokenUtil.class);
    /**
     * Redis模板
     */
    private static StringRedisTemplate template;

    /**
     * @param template JRedis 模板
     * @desc 注入模板
     * @author liuze
     * @date 2017/2/8
     * @time 18:21
     * @update_user
     * @update_time
     * @update_desc:
     */
    @Autowired(required = true)
    public void setTemplate(StringRedisTemplate template) {
        TokenUtil.template = template;
    }



    /**
     * 用户公司信息
     *
     * @param uid
     * @return
     */
    public static Map<String, String> getCompany(String uid) {

        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            return json.getObject("company", Map.class);
        } catch (Exception e) {
            return null;
        }
    }


    /**
     * 用户信息
     *
     * @param uid
     * @return
     */
    public static Map<String, String> getUser(String uid) {
        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            return json.getObject("user", Map.class);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 用户组织信息
     *
     * @param uid
     * @return
     */
    public static Map<String, String> getOrgInfo(String uid) {

        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            return json.getObject("org", Map.class);
        } catch (Exception e) {
            return new HashMap();
        }
    }

    /**
     * 用户部门信息
     *
     * @param uid
     * @return
     */
    public static Map<String, String> getDept(String uid) {

        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            return json.getObject("dept", Map.class);
        } catch (Exception e) {
            return new HashMap();
        }
    }


    public static Map<String, String> getRole(String uid) {

        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            return json.getObject("resRole", Map.class);
        } catch (Exception e) {
            return new HashMap();
        }
    }

    /**
     * 用户部门ID
     *
     * @param uid
     * @return
     */

    public static String getDeptId(String uid) {

        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            Map dept = json.getObject("dept", Map.class);
            return String.valueOf(dept.get("id" ));
        } catch (Exception e) {
            return "";
        }
    }

    /**
     * 用户公司ID信息
     *
     * @param uid
     * @return
     */
    public static String getCompanyId(String uid) {

        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            Map dept = json.getObject("company", Map.class);
            return String.valueOf(dept.get("id" ));
        } catch (Exception e) {
            return "";
        }
    }

    /**
     * 用户资源
     *
     * @param uid
     * @return
     */
    public static Map<String, String> getRes(String uid) {
        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            return json.getObject("res", Map.class);
        } catch (Exception e) {
            return new HashMap();
        }
    }

    /**
     * 用户部门权限
     *
     * @param uid
     * @return
     */
    public static Map<String, String> getDataDept(String uid) {

        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            return json.getObject("dataOrg", Map.class);
        } catch (Exception e) {
            return new HashMap();
        }
    }

    /***
     * 用户用户权限
     * @param uid
     * @return
     */
    public static Map<String, String> getDataUser(String uid) {

        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            return json.getObject("dataUser ", Map.class);
        } catch (Exception e) {
            return new HashMap();
        }

    }

    /**
     * 用户拥有的按钮
     *
     * @param uid
     * @return
     */
    public static Map<String, List<Map<String, Object>>> getBtnMap(String uid) {

        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            return json.getObject("btn", Map.class);
        } catch (Exception e) {
            return new HashMap();
        }

    }

    /**
     * 获取用户可访问的 URL 集合
     *
     * @param uid
     * @return
     */
    public static Map<String, String> getUrlMap(String uid) {

        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            return json.getObject("url ", Map.class);
        } catch (Exception e) {
            return new HashMap();
        }

    }

    /**
     * 获取用户所拥有的数据角色
     *
     * @param uid
     * @return
     */
    public static Map<String, String> getRoleDate(String uid) {

        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            return json.getObject("dataOrg", Map.class);
        } catch (Exception e) {
            return new HashMap<>();
        }

    }

    public static void setRoleDate(String uid, Map data) {
        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            json.put("dataOrg", data);
            template.opsForValue().set(uid, json.toString());
        } catch (Exception e) {
        }
    }


    /**
     * @param uid
     * @return
     */
    public static String getToken(String uid) {
        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            return json.getObject("token", String.class);
        } catch (Exception e) {
            return "";
        }
    }

    /**
     * 根据用户 ID，判断是否是分公司管理员
     * 后期判断
     *
     * @return
     */
    public static boolean isCompanyAdmin(String uid) {
        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            return json.getObject("isManger", Boolean.class);
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 获得在APP登录用户的客户端ID
     *
     * @param uid
     * @return
     */
    public static String getClientId(String uid) {
        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            return json.getObject("clientid", String.class);
        } catch (Exception e) {
            return "";
        }
    }

    /**
     * 根据用户 ID，判断是否是集团管理员
     * 后期判断
     *
     * @return
     */
    public static boolean isJtAdmin(String uid) {
        return false;
    }


    /**
     * 获得权限信息
     *
     * @param uid
     * @return
     */
    public static List<Map<String,Object>> getDataCompany(String uid) {
        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            JSONArray jsonArray=json.getJSONArray("dataCompany");
            List<Map<String,Object>> dataCompanys=new ArrayList<>();
            for(int i=0;i<jsonArray.size();i++){
                JSONObject company=(JSONObject) jsonArray.get(i);
                Map map=JSONObject.toJavaObject(company,Map.class);
                dataCompanys.add(map);
            }
            return dataCompanys;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 获得区域信息
     * @param uid
     * @return
     */
    public static List<Map<String,Object>> getDataArea(String uid) {
        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            JSONArray jsonArray=json.getJSONArray("dataArea");
            List<Map<String,Object>> dataAreas=new ArrayList<>();
            for(int i=0;i<jsonArray.size();i++){
                JSONObject company=(JSONObject) jsonArray.get(i);
                Map map=JSONObject.toJavaObject(company,Map.class);
                dataAreas.add(map);
            }
            return dataAreas;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 获得品牌信息
     * @param uid
     * @return
     */
    public static List<Map<String,Object>> getDataBrand(String uid) {
        String str = template.opsForValue().get(uid);
        try {
            JSONObject json = JSON.parseObject(str);
            JSONArray jsonArray=json.getJSONArray("dataBrand");
            List<Map<String,Object>> dataBrands=new ArrayList<>();
            for(int i=0;i<jsonArray.size();i++){
                JSONObject company=(JSONObject) jsonArray.get(i);
                Map map=JSONObject.toJavaObject(company,Map.class);
                dataBrands.add(map);
            }
            return dataBrands;
        } catch (Exception e) {
            return null;
        }
    }
}